JavaScript的一些细节知识总结

一、函数的定义方式:

说法一:JavaScript提供两种函数的定义方式,一种是有返回值,一种是没有返回值(这种函数有时叫做子程或void函数)。

1.有返回值的:

1
2
3
4
5
6
7
8
9
10
function factorial(num){
var product = 1;
for (var i = 0; i < num; i++) {
product *= num;
}
return product;
}
print(factorial(4));//24
print(factorial(5));//120
print(factorial(10));//3628800

2.无返回值的:

1
2
3
4
5
6
7
8
function curve(arr, amount){
for (var i = 0; i < arr.length; i++) {
arr[i] += amount;
}
}
var grades = [80,83,74,71,90];
curve(grades,5);
print(grades);//85,88.79,76,95

说法二:函数声明、函数表达式、Function()构造函数三种方法来定义。

1.函数声明:

1
2
3
function functionName(arg0,arg1,arg2){
//函数体
}

2.函数表达式:

1
2
3
var functionName = function(arg0,arg1,arg2){
//函数体
}

3.Function()构造函数:

1
2
3
4
5
var functionName = new Function('a','b','return a+b;');
//调用上面定义的add函数
var sum=functionName(3,4);
alert(sum);
//注意这里的调用方法!

类比:(下面的是构造函数法创建对象)

1
2
3
4
5
6
7
8
9
10
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
};
}
var person1 = new Person('cooling1',20,'Web Engineer');
var person2 = new Person('cooling2',23,'Web Engineer');

二、递归

1.即通过函数名调用自身:

1
2
3
4
5
6
7
8
function factorial(num){
if (num <= 1) {
return 1;
}
else{
return num * factorial(num - 1);
}
}

2.注意,该函数表面没有太大问题,但是下面的代码可能会导致它出错:

此处代码可以将factorial()函数保存在变量anotherFactorial中。当调用anotherFactorial()的时候,factorial已经不再是函数。

1
2
3
var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(4));//出错

3.解决方案:
①使用arguments.callee,arguments.callee是一个指向正在执行的函数的指针,因此可以通过它实现对函数的递归调用。

1
2
3
4
5
6
7
8
function factorial(num){
if (num <= 1) {
return 1;
}
else{
return num * arguments.callee(num - 1);
}
}

②在①中在严格模式下是不能通过脚本访问arguments.callee的。所以可以通过命名函数表达式来达到相同的效果:

1
2
3
4
5
6
7
8
var factorial =( f(num){
if (num <= 1) {
return 1;
}
else{
return num * f(num - 1);
}
});

在这里,通过逐步优化,最后避免了最初的:可能通过在函数外部的操作,导致函数出问题的情况。可能通过这种优化处理的方式,使得函数避免了被污染问题。